home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_10 / allison / arglist.cpp < prev    next >
C/C++ Source or Header  |  1994-09-06  |  1KB  |  59 lines

  1. LISTING 13
  2. #include <fstream.h>
  3. #include <string.h>
  4. #include "arglist.h"
  5.  
  6. Arglist::Arglist(size_t arg_count, char **arg_vec)
  7. {
  8.     args = new char*[arg_count];
  9.     available = arg_count;
  10.     used = 0;
  11.     // INVARIANT: available+used == amount allocated
  12.  
  13.     for (int i = 0; i < arg_count; ++i)
  14.         if (arg_vec[i][0] == '@')
  15.             expand(arg_vec[i]+1);
  16.         else
  17.             add(arg_vec[i]);
  18. }
  19.  
  20. Arglist::~Arglist()
  21. {
  22.     for (int i = 0; i < used; ++i)
  23.         delete [] args[i];
  24.     delete [] args;
  25. }
  26.  
  27. void Arglist::expand(char *fname)
  28. {
  29.     ifstream f(fname);
  30.     const size_t BUFSIZ = 64;
  31.     char token[BUFSIZ];
  32.  
  33.     while (f >> token)
  34.         if (token[0] == '@')
  35.             expand(token+1);
  36.         else
  37.             add(token);
  38. }
  39.  
  40. void Arglist::add(char *arg)
  41. {
  42.     if (!available)
  43.     {
  44.         /* Grow argument list */
  45.         char **new_args = new char*[used + CHUNK];
  46.         for (int i = 0; i < used; ++i)
  47.             new_args[i] = args[i];
  48.         delete [] args;
  49.         args = new_args;
  50.         available = CHUNK;
  51.     }
  52.  
  53.     /* Allocate space for and store argument */
  54.     args[used] = new char[strlen(arg) + 1];
  55.     strcpy(args[used++], arg);
  56.     --available;
  57. }
  58.  
  59.